﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Diagnostics;

namespace mrp16062010
{
    class Yukle
    {
        public string Id { get; set; }
        public static int sayac = 1;

        private Tarih yuklemeTarihi;

        public Tarih YuklemeTarihi
        {
            get { return yuklemeTarihi; }
            set { yuklemeTarihi = value; }
        }

        private Siparis siparisBilgi;

        public Siparis SiparisBilgi
        {
            get { return siparisBilgi; }
            set { siparisBilgi = value; }
        }
        
        
        public Yukle(Cizelge cizelge, Siparis siparis)
        {
            
            siparisBilgi = siparis;
            Tarih tarih = siparis.TarihBilgisi;
            Rota.RotaParcasi rotaParcasi = siparis.Rota;
            //rotaParcasi.SiparisAdedi = siparis.Adet;
            cizelge.Tarihler.BaslangicTarihi = DateTime.FromBinary(tarih.BaslangicTarihi.ToBinary());
            cizelge.Tarihler.BitisTarihi = DateTime.FromBinary(tarih.BitisTarihi.ToBinary());

            if (Ayarlar.Nesne.SadeceIleriYukle)
            {
                IleriYukle iy = new IleriYukle(cizelge, siparis);
                yuklemeTarihi = iy.YuklemeTarihi;
            }
            else
            {
                GeriYukle gy = new GeriYukle(cizelge, siparis);
                if (gy.IsYuklendi)
                {
                    //Geri Yüklendi
                    yuklemeTarihi = gy.YuklemeTarihi;
                }
                else
                {
                    IleriYukle iy = new IleriYukle(cizelge, siparis);
                    yuklemeTarihi = iy.YuklemeTarihi;
                }
            }
            IsParcalariniIliskile(cizelge, siparis);
            Sirala(cizelge);
            siparis.PlanlamaTarihleri = yuklemeTarihi;
            GC.Collect();
        }

        private void Sirala(Cizelge cizelge)
        {
            foreach (CizelgeIsMerkezi item in cizelge.Merkezler)
            {
                item.IsListe = (from x in item.IsListe
                               orderby x.BasTarihi ascending
                               select x).ToList();
                //GC.Collect();
            }
        }

        private void IsParcalariniIliskile(Cizelge cizelge, Siparis siparis)
        {
            Rota.RotaParcasi rota = siparis.Rota;
            Iliskilendir(cizelge, null, rota.OperasyonList.Last());
        }

        private void Iliskilendir(Cizelge cizelge, IsParcasi oncekiParca, Rota.Operasyon eldekiOp)
        {
            CizelgeIsMerkezi merkez = cizelge.Merkezler.Where(x => x.Merkez.Kod == eldekiOp.IsMerkeziRota.Kod).Single();
            IsParcasi eldekiParca = merkez.IsListe.Where(x => x.Op == eldekiOp && x.SiparisBilgi == siparisBilgi).Single();
            eldekiParca.SiparisBilgi.IsParcalari.Add(eldekiParca);
            if (oncekiParca!=null)
            {
                oncekiParca.ArkasindakiIsParcalari.Add(eldekiParca);
            }
            
            eldekiParca.OnundekiIsParcasi = oncekiParca;
            Rota.Operasyon sonrakiOperasyon = eldekiOp.AltindakiOperasyon;
            if (sonrakiOperasyon != null)
            {
                Iliskilendir(cizelge, eldekiParca, sonrakiOperasyon);
            }
            else
            {
                foreach (Rota.RotaParcasi rp in eldekiOp.AltParca)
                {
                    if (rp.OperasyonList.Count>0)
                    {
                        Iliskilendir(cizelge, eldekiParca, rp.OperasyonList.Last());
                    }
                }
            }
        }
        
        
    }
}
